package com.gym.manager.interfaz;

import com.gym.manager.mundo.Deportista;
import com.gym.manager.mundo.Ejercicio;
import com.gym.manager.mundo.Gimnasio;
import com.gym.manager.mundo.Rutina;
import java.util.Date;
import java.util.Vector;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.midlet.*;

public class MIDletGymManager extends MIDlet {

    private boolean midletPaused = false;
    private FormaPrincipal pantallaPrincipal;
    private Gimnasio gimnasio;

    /**
     * Metodo que se sejecuta para destruir la aplicacion
     */
    protected void destroyApp(boolean unconditional) {
    }

    /**
     * Metodo que permite pausar la ejecución de la aplicación
     */
    protected void pauseApp() {
        midletPaused = true;
    }

    /**
     * Metodo que inicializa la aplicación
     */
    private void initialize() {

        gimnasio = new Gimnasio();
        pantallaPrincipal = new FormaPrincipal(this);
    }

    /**
     * Metodo que inicia la ejecución de la aplicación
     * @throws MIDletStateChangeException en caso de que no se pueda cambiar el estado del MIDlet a activo
     */
    protected void startApp() throws MIDletStateChangeException {
        if (midletPaused) {
            resumeMIDlet();
        } else {
            initialize();
            startMIDlet();
        }
        midletPaused = false;
    }

    /**
     * Metodo que cambia la pantalla desplegada.
     * @param alert la alerta que se de sea desplegar.
     * @param nextDisplayable la pantalla que se desea desplegar.
     */
    public void switchDisplayable(Alert alert, Displayable nextDisplayable) {
        Display display = getDisplay();
        if (alert == null) {
            display.setCurrent(nextDisplayable);
        } else {
            display.setCurrent(alert, nextDisplayable);
        }
    }

    /**
     * Devuelve la pantalla donde se esta desplegando la aplicación.
     * @return pantalla de despliegue.
     */
    private Display getDisplay() {
        return Display.getDisplay(this);
    }

    /**
     * Metodo que reinicia la aplicaciòn despues de haber sido pausada.
     */
    private void resumeMIDlet() {
    }

    /**
     * Inicia el despleigue del MIDlet mostrando su pantalla principal;
     */
    private void startMIDlet() {
        switchDisplayable(null, pantallaPrincipal);
    }

    /**
     * Metodo que termina la ejecución de la aplicación.
     */
    public void exitMIDlet() {
        switchDisplayable(null, null);
        destroyApp(true);
        notifyDestroyed();
    }

    public void mostrarOpcionesManejoRutina() {

        OpcionesManejoRutina f = new OpcionesManejoRutina(this);
        switchDisplayable(null, f);

    }

    public void mostrarAgregarRutina() {
        FormaAgregarRutina f = new FormaAgregarRutina(this);
        switchDisplayable(null, f);
    }

    public void mostrarFormaPrincipal(Alert alerta) {
        switchDisplayable(alerta, pantallaPrincipal);
    }

    public void mostrarFormaEditarRutina(Alert alerta, Rutina rut) {
        FormaEditarRutina f = new FormaEditarRutina(this, rut);
        switchDisplayable(alerta, f);
    }

    public void mostrarListaRutinasEdicion() {
        Vector v = gimnasio.getUsuario().getHistorialRutinas();
        ListaRutinas f = new ListaRutinas(1, v, this);
        switchDisplayable(null, f);
    }

    public void mostrarListaRutinasEliminar() {
        Vector v = gimnasio.getUsuario().getHistorialRutinas();
        ListaRutinas f = new ListaRutinas(0, v, this);
        switchDisplayable(null, f);
    }

    public void eliminarRutina(Rutina param) {
        //TODO:
    }

    void mostrarFormaEnEdicion(Alert alerta, Rutina rut, int a, int b, int c) {
        FormaEditarRutina f = new FormaEditarRutina(this, rut, a, b, c);
        switchDisplayable(alerta, f);
    }

    void mostrarRegistrarProgreso() {
        FormaRegistrarProgreso f = new FormaRegistrarProgreso(this);
        switchDisplayable(null, f);
    }

    void mostrarEjercicioActual() {
        Rutina r = darDeportista().getRutinaActual();
        FormaEjercicioActual f = new FormaEjercicioActual(this, r.getEjercicioActual());
        switchDisplayable(null, f);
    }

    public Rutina crearRutina(Date fechaInicio, Date fechaFin) {
        return gimnasio.crearRutina(fechaInicio, fechaFin);
    }

    public Vector darObjetivos() {
        return gimnasio.getObjetivos();
    }

    Vector darEjercicios() {
        return gimnasio.getEjercicios();

    }

    public void mostrarAyuda() {
        FormaAyuda f = new FormaAyuda(this);
        switchDisplayable(null, f);
    }

    public Deportista darDeportista() {
        return gimnasio.getUsuario();
    }
}
